﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using BrasilFramework.Controle.Silverlight.Comum;

namespace BrasilFramework.Controle.Silverlight
{
    public partial class Mensagem
    {
        public Mensagem()
        {
            InitializeComponent();
        }

        #region Enumeradores

        #region CodigoSaida enum

        public enum CodigoSaida
        {
            Cancelar,
            OK
        }

        #endregion

        #region TipoBotao enum

        public enum TipoBotao
        {
            OK,
            SimNao,
            OKCancelar
        }

        #endregion

        #region TipoIcone enum

        public enum TipoIcone
        {
            Informacao,
            Aviso,
            Erro,
            Pergunta,
            Sucesso
        }

        #endregion

        #endregion

        public class MensagemEventArgs : EventArgs
        {
            public CodigoSaida Codigo { get; set; }
        }

        public delegate void MensagemFechou(Mensagem sender, MensagemEventArgs e);

        public CodigoSaida CodigoSaidaMensagem { get; set; }

        private void OnClick(object sender, RoutedEventArgs e)
        {
            CodigoSaidaMensagem = (CodigoSaida)((Button)sender).Tag;

            switch (CodigoSaidaMensagem)
            {
                case CodigoSaida.OK:
                    DialogResult = true;
                    break;
                default:
                    DialogResult = false;
                    break;
            }
        }

        #region Métodos Públicos

        private static void MostrarInterno(string titulo, string mensagem, TipoIcone tipoIcone, string detalhe = null)
        {
            Mostrar(titulo, mensagem, TipoBotao.OK, tipoIcone, null, detalhe);
        }

        public static void MostrarInformacao(string titulo, string mensagem)
        {
            MostrarInterno(titulo, mensagem, TipoIcone.Informacao);
        }

        public static void MostrarAviso(string titulo, List<string> listaMensagem)
        {
            string mensagem = listaMensagem.Aggregate(string.Empty, (current, validacao) => current + string.Format("- {0}\n", validacao));
            MostrarInterno(titulo, mensagem, TipoIcone.Aviso);
        }

        public static void MostrarAviso(string titulo, string mensagem)
        {
            MostrarInterno(titulo, mensagem, TipoIcone.Aviso);
        }

        public static void MostrarErro(string titulo, string mensagem)
        {
            MostrarInterno(titulo, mensagem, TipoIcone.Erro);
        }

        public static void MostrarErro(string titulo, string mensagem, string detalhe)
        {
            MostrarInterno(titulo, mensagem, TipoIcone.Erro, detalhe);
        }

        public static void MostrarSucesso(string titulo, string mensagem)
        {
            MostrarInterno(titulo, mensagem, TipoIcone.Sucesso);
        }

        public static void MostrarPergunta(string titulo, string mensagem, MensagemFechou eventoRetorno)
        {
            Mostrar(titulo, mensagem, TipoBotao.SimNao, TipoIcone.Pergunta, eventoRetorno);
        }

        public static void Mostrar(string titulo, string mensagem, TipoBotao tipoBotao, TipoIcone tipoIcone,
                                       MensagemFechou eventoRetorno, string detalhe = null)
        {
            var mensagemAux = new Mensagem(titulo, mensagem, tipoBotao, tipoIcone, eventoRetorno, detalhe) { HasCloseButton = false };

            mensagemAux.Show();
        }

        #endregion

        #region Métodos Privados

        private Mensagem(string titulo, string mensagem, TipoBotao tipoBotao, TipoIcone tipoIcone,
                         MensagemFechou eventoRetorno, string detalhe = null)
        {
            InitializeComponent();

            Closed += (snd, e) =>
                          {
                              if (eventoRetorno != null)
                                  eventoRetorno(this, new MensagemEventArgs { Codigo = CodigoSaidaMensagem });
                          };

            btnA.Click += OnClick;
            btnB.Click += OnClick;

            if (!string.IsNullOrEmpty(titulo)) Title = titulo;

            txtMensagem.Text = mensagem;

            expDetalhe.Visibility = Visibility.Collapsed;

            if (!string.IsNullOrEmpty(detalhe))
            {
                expDetalhe.Header = Comum.Mensagem.Detalhes;
                txtDetalhe.Text = detalhe;
                expDetalhe.Visibility = Visibility.Visible;
            }

            ConfigurarBotao(tipoBotao);
            ConfigurarIcone(tipoIcone);
        }

        private void ConfigurarBotao(TipoBotao tipoBotao)
        {
            switch (tipoBotao)
            {
                case TipoBotao.OKCancelar:
                    btnA.Content = Comum.Mensagem.OK;
                    btnA.Tag = CodigoSaida.OK;
                    btnB.Content = Comum.Mensagem.Cancelar;
                    btnB.Tag = CodigoSaida.Cancelar;
                    break;
                case TipoBotao.SimNao:
                    btnA.Content = Comum.Mensagem.Sim;
                    btnA.Tag = CodigoSaida.OK;
                    btnB.Content = Comum.Mensagem.Nao;
                    btnB.Tag = CodigoSaida.Cancelar;
                    break;
                default:
                    btnA.Visibility = Visibility.Collapsed;
                    btnB.Content = Comum.Mensagem.OK;
                    btnB.Tag = CodigoSaida.OK;
                    break;
            }
        }

        private void ConfigurarIcone(TipoIcone tipoIcone)
        {
            switch (tipoIcone)
            {
                case TipoIcone.Aviso:
                    imgMensagem.Source = Imagem.Aviso;
                    break;
                case TipoIcone.Erro:
                    imgMensagem.Source = Imagem.Erro;
                    break;
                case TipoIcone.Pergunta:
                    imgMensagem.Source = Imagem.Pergunta;
                    break;
                case TipoIcone.Sucesso:
                    imgMensagem.Source = Imagem.Sucesso;
                    break;
                default:
                    imgMensagem.Source = Imagem.Informacao;
                    break;
            }
        }

        #endregion

        private void ChildWindow_KeyDown(object sender, KeyEventArgs e)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.C)
                Clipboard.SetText(txtMensagem.Text);
        }
    }
}